一文搞懂 java 泛型,也有可能搞不懂,毕竟讲得太全面了

您所在的位置:网站首页 java 返回list泛型 一文搞懂 java 泛型,也有可能搞不懂,毕竟讲得太全面了

一文搞懂 java 泛型,也有可能搞不懂,毕竟讲得太全面了

2023-09-01 23:48| 来源: 网络整理| 查看: 265

一、引言 Java泛型的背景和作用

Java泛型是Java编程语言中的一个特性,引入泛型的目的是为了增强代码的类型安全性和重用性。在没有泛型之前,Java中的集合类(如ArrayList、HashMap等)只能存储Object类型的对象,这使得在使用集合时需要进行强制类型转换,容易出现类型错误。

泛型的背景:在Java 5版本之前,Java的类型是静态的,在编译时确定,并且在运行时擦除类型信息。这种情况下,编译器无法对集合的元素类型进行验证,因此可能会导致运行时类型错误。为了解决这个问题,Java引入了泛型机制。

泛型的作用:

类型安全:泛型使得在编译时就能够检测到类型错误,避免了在运行时出现类型转换异常。 代码重用:通过使用泛型,可以编写通用的代码,适用于多种不同类型的数据,提高了代码的灵活性和复用性。 API设计:泛型使得API的设计更加清晰和一致,可以定义泛型接口、类和方法,提供更加灵活的参数类型和返回值类型。 增强集合类:泛型使集合类更加类型安全和简洁,不再需要显式进行类型转换。

在使用泛型时,可以定义类、接口、方法和变量等具有泛型参数,并通过使用具体的类型实参来指定泛型的具体类型。例如,可以定义一个泛型类ArrayList,其中的T表示类型参数,可以在创建ArrayList对象时指定具体的类型,如ArrayList表示存储整数的ArrayList。

泛型的基本概念和好处 基本概念: 类型参数:在泛型中,使用类型参数来表示一个未知的类型。类型参数可以用任意标识符来表示,通常使用单个大写字母作为惯例,如T、E、K等。 实际类型参数:在使用泛型时,需要指定具体的类型给类型参数,这些具体的类型被称为实际类型参数。例如,在创建一个泛型类的实例时,可以将Integer作为实际类型参数传递给类型参数T,从而创建一个存储整数的对象。 好处:

类型安全性:泛型提供了更严格的类型检查,在编译时就能够发现类型错误。通过指定具体的类型参数,可以在编译期间捕获不兼容的类型操作,避免了在运行时出现类型转换错误和相关的异常。

代码重用性:泛型使得我们可以编写通用的代码逻辑,可以在多种类型上进行操作,而无需为每种类型都编写相应的代码。这样可以减少代码的重复,提高代码的可维护性和可读性。

高效性:泛型在编译时进行类型擦除,将泛型类型转换为它们的边界类型(通常是Object类型)。这意味着在运行时并不需要保留泛型的类型信息,从而避免了额外的开销,提高了程序的性能。

二、泛型类型和方法 泛型类 定义泛型类的语法和使用方法

在许多编程语言中,如Java和C#,泛型类是一种特殊类型的类,它可以接受不同类型的参数进行实例化。泛型类提供了代码重用和类型安全性的好处,因为它们可以与各种数据类型一起使用,而无需为每种类型编写单独的类。

下面是定义泛型类的语法:

public class GenericClass { // 类成员和方法定义 }

在上面的示例中,GenericClass 是一个泛型类的名称, 表示类型参数,T 可以替换为任何合法的标识符,用于表示实际类型。

要使用泛型类,可以通过指定实际类型来实例化它。例如,假设我们有一个名为 MyClass 的泛型类,我们可以按以下方式使用它:

GenericClass myInstance = new GenericClass();

在上面的示例中,我们使用整数类型实例化了 GenericClass 泛型类。这样,myInstance 将是一个只能存储整数类型的对象。

在实例化泛型类后,可以使用该类中定义的成员和方法,就像普通的类一样。不同之处在于,泛型类中的成员或方法可以使用类型参数 T,并且会根据实际类型进行类型检查和处理。

如果需要在泛型类中使用多个类型参数,可以通过逗号分隔它们:

public class MultiGenericClass { // 类成员和方法定义 }

上面的示例定义了一个具有两个类型参数的泛型类 MultiGenericClass。

总结起来,定义泛型类的语法是在类名后面使用 或其他类型参数,并在类中使用这些类型参数。然后,可以通过指定实际类型来实例化泛型类,并可以使用泛型类中定义的成员和方法。

类型参数的限定和通配符的使用

类型参数的限定:

类型参数的限定允许我们对泛型类或方法的类型参数进行约束,以确保只能使用特定类型或满足特定条件的类型。

在 Java 中,可以使用关键字 extends 来限定类型参数。有两种类型参数的限定方式:

单一限定(Single Bound):指定类型参数必须是某个类或接口的子类。

public class MyClass { // 类成员和方法定义 }

在上面的示例中,类型参数 T 必须是 SomeClass 类的子类或实现了 SomeClass 接口的类型。

多重限定(Multiple Bounds):指定类型参数必须是多个类或接口的子类,并且只能有一个类(如果有)。

public class MyClass { // 类成员和方法定义 }

在上面的示例中,类型参数 T 必须是 ClassA 类的子类,并且还要实现 InterfaceB 和 InterfaceC 接口。

通过类型参数的限定,可以在泛型类或方法中对类型进行更精确的控制和约束,以提高代码的类型安全性和灵活性。

通配符的使用:

通配符是一种特殊的类型参数,用于在泛型类或方法中表示未知类型或不确定的类型。有两种通配符可以使用:

无限定通配符(Unbounded Wildcard):使用问号 ? 表示,表示可以匹配任何类型。

public void myMethod(List myList) { // 方法实现 }

在上面的示例中,myMethod 方法接受一个类型为 List 的参数,但是该列表的元素类型是未知的,可以是任何类型。

有限定通配符(Bounded Wildcard):使用 extends 和具体类或接口来限定通配符所能匹配的类型范围。

public void myMethod(List list) { // 方法体 }

有限制通配符(Bounded wildcard):使用 extends 关键字指定上界或者使用 super 关键字指定下界,限制了泛型方法接受的参数类型范围。

// 泛型方法接受 Number 及其子类的参数 void myGenericMethod(List


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3